Exploración por curvas
##Curvas por año
datos %>%
filter(plazo=="Corto") %>%
ggplot(aes(x = plazo_en_anos, y = tasa_percent, color = as.factor(fecha))) +
geom_line() +
scale_color_manual(values = grDevices::colorRampPalette(RColorBrewer::brewer.pal(8, "Dark2"))(257)) +
theme(legend.position = "none",
plot.title = element_text(hjust = 0.5)) +
scale_x_continuous(breaks=seq(0, 10, 1))+
ylim(0,15)+
ylab("Tasas") +
xlab("Plazo") +
ggtitle("Curvas de rendimientos por año - Corto Plazo")+
facet_grid(~anno)

datos %>%
filter(plazo=="Mediano") %>%
ggplot(aes(x = plazo_en_anos, y = tasa_percent, color = as.factor(fecha))) +
geom_line() +
scale_color_manual(values = grDevices::colorRampPalette(RColorBrewer::brewer.pal(8, "Dark2"))(257)) +
theme(legend.position = "none",
plot.title = element_text(hjust = 0.5)) +
scale_x_continuous(breaks=seq(0, 10, 1))+
ylim(0,15)+
ylab("Tasas") +
xlab("Plazo") +
ggtitle("Curvas de rendimientos por año - Mediano Plazo")+
facet_grid(~anno)

datos %>%
filter(plazo=="Largo") %>%
ggplot(aes(x = plazo_en_anos, y = tasa_percent, color = as.factor(fecha))) +
geom_line() +
scale_color_manual(values = grDevices::colorRampPalette(RColorBrewer::brewer.pal(8, "Dark2"))(257)) +
theme(legend.position = "none",
plot.title = element_text(hjust = 0.5)) +
scale_x_continuous(breaks=seq(0, 10, 1))+
ylim(0,15)+
ylab("Tasas") +
xlab("Plazo") +
ggtitle("Curvas de rendimientos por año - Largo plazo")+
facet_grid(~anno)

Para el corto y mediano plazo, al ver las curvas por año se aprecia que de los años 2017 al 2019 se tienen las tasas mas altas. Las tasas del 2020 son más bajas.
##Curvas por mes
datos %>%
filter(plazo=="Corto") %>%
ggplot(aes(x = plazo_en_anos, y = tasa_percent, color = as.factor(fecha))) +
geom_line() +
scale_color_manual(values = grDevices::colorRampPalette(RColorBrewer::brewer.pal(8, "Dark2"))(257)) +
theme(legend.position = "none",
plot.title = element_text(hjust = 0.5)) +
scale_x_continuous(breaks=seq(0, 10, 1))+
ylim(0,15)+
ylab("Tasas") +
xlab("Plazo") +
ggtitle("Curvas de rendimientos por mes - Corto Plazo")+
facet_grid(~mes)

datos %>%
filter(plazo=="Mediano") %>%
ggplot(aes(x = plazo_en_anos, y = tasa_percent, color = as.factor(fecha))) +
geom_line() +
scale_color_manual(values = grDevices::colorRampPalette(RColorBrewer::brewer.pal(8, "Dark2"))(257)) +
theme(legend.position = "none",
plot.title = element_text(hjust = 0.5)) +
scale_x_continuous(breaks=seq(0, 10, 1))+
ylim(0,15)+
ylab("Tasas") +
xlab("Plazo") +
ggtitle("Curvas de rendimientos por mes - Mediano Plazo")+
facet_grid(~mes)

datos %>%
filter(plazo=="Largo") %>%
ggplot(aes(x = plazo_en_anos, y = tasa_percent, color = as.factor(fecha))) +
geom_line() +
scale_color_manual(values = grDevices::colorRampPalette(RColorBrewer::brewer.pal(8, "Dark2"))(257)) +
theme(legend.position = "none",
plot.title = element_text(hjust = 0.5)) +
scale_x_continuous(breaks=seq(0, 10, 1))+
ylim(0,15)+
ylab("Tasas") +
xlab("Plazo") +
ggtitle("Curvas de rendimientos por mes - Largo plazo")+
facet_grid(~mes)

##Curvas por trimestre
datos %>%
filter(plazo=="Corto") %>%
ggplot(aes(x = plazo_en_anos, y = tasa_percent, color = as.factor(fecha))) +
geom_line() +
scale_color_manual(values = grDevices::colorRampPalette(RColorBrewer::brewer.pal(8, "Dark2"))(257)) +
theme(legend.position = "none",
plot.title = element_text(hjust = 0.5)) +
scale_x_continuous(breaks=seq(0, 10, 1))+
ylim(0,15)+
ylab("Tasas") +
xlab("Plazo") +
ggtitle("Curvas de rendimientos por trimestre - Corto Plazo")+
facet_grid(~trimestre)

datos %>%
filter(plazo=="Mediano") %>%
ggplot(aes(x = plazo_en_anos, y = tasa_percent, color = as.factor(fecha))) +
geom_line() +
scale_color_manual(values = grDevices::colorRampPalette(RColorBrewer::brewer.pal(8, "Dark2"))(257)) +
theme(legend.position = "none",
plot.title = element_text(hjust = 0.5)) +
scale_x_continuous(breaks=seq(0, 10, 1))+
ylim(0,15)+
ylab("Tasas") +
xlab("Plazo") +
ggtitle("Curvas de rendimientos por trimestre - Mediano Plazo")+
facet_grid(~trimestre)

datos %>%
filter(plazo=="Largo") %>%
ggplot(aes(x = plazo_en_anos, y = tasa_percent, color = as.factor(fecha))) +
geom_line() +
scale_color_manual(values = grDevices::colorRampPalette(RColorBrewer::brewer.pal(8, "Dark2"))(257)) +
theme(legend.position = "none",
plot.title = element_text(hjust = 0.5)) +
scale_x_continuous(breaks=seq(0, 10, 1))+
ylim(0,15)+
ylab("Tasas") +
xlab("Plazo") +
ggtitle("Curvas de rendimientos por trimestre - Largo plazo")+
facet_grid(~trimestre)

Curvas por semana
datos %>%
filter(plazo=="Corto") %>%
ggplot(aes(x = plazo_en_anos, y = tasa_percent, color = as.factor(fecha))) +
geom_line() +
scale_color_manual(values = grDevices::colorRampPalette(RColorBrewer::brewer.pal(8, "Dark2"))(257)) +
theme(legend.position = "none",
plot.title = element_text(hjust = 0.5)) +
scale_x_continuous(breaks=seq(0, 10, 1))+
ylim(0,15)+
ylab("Tasas") +
xlab("Plazo") +
ggtitle("Curvas de tasas por semana - Corto Plazo")

datos %>%
filter(plazo=="Mediano") %>%
ggplot(aes(x = plazo_en_anos, y = tasa_percent, color = as.factor(fecha))) +
geom_line() +
scale_color_manual(values = grDevices::colorRampPalette(RColorBrewer::brewer.pal(8, "Dark2"))(257)) +
theme(legend.position = "none",
plot.title = element_text(hjust = 0.5)) +
scale_x_continuous(breaks=seq(0, 10, 1))+
ylim(0,15)+
ylab("Tasas") +
xlab("Plazo") +
ggtitle("Curvas de tasas por semana - Mediano Plazo")

datos %>%
filter(plazo=="Largo") %>%
ggplot(aes(x = plazo_en_anos, y = tasa_percent, color = as.factor(fecha))) +
geom_line() +
scale_color_manual(values = grDevices::colorRampPalette(RColorBrewer::brewer.pal(8, "Dark2"))(257)) +
theme(legend.position = "none",
plot.title = element_text(hjust = 0.5)) +
scale_x_continuous(breaks=seq(0, 10, 1))+
ylim(0,15)+
ylab("Tasas") +
xlab("Plazo") +
ggtitle("Curvas de tasas por semana - Largo plazo")

Curvas por año y trimestres
datos %>%
filter(plazo=="Corto") %>%
ggplot(aes(x = plazo_en_anos, y = tasa_percent, color = as.factor(fecha))) +
geom_line() +
scale_color_manual(values = grDevices::colorRampPalette(RColorBrewer::brewer.pal(8, "Dark2"))(257)) +
theme(legend.position = "none",
plot.title = element_text(hjust = 0.5)) +
scale_x_continuous(breaks=seq(0, 10, 1))+
ylim(0,15)+
ylab("Tasas") +
xlab("Plazo") +
ggtitle("Curvas de rendimientos por año y trimestre - Corto Plazo")+
facet_grid(trimestre~anno)

datos %>%
filter(plazo=="Mediano") %>%
ggplot(aes(x = plazo_en_anos, y = tasa_percent, color = as.factor(fecha))) +
geom_line() +
scale_color_manual(values = grDevices::colorRampPalette(RColorBrewer::brewer.pal(8, "Dark2"))(257)) +
theme(legend.position = "none",
plot.title = element_text(hjust = 0.5)) +
scale_x_continuous(breaks=seq(0, 10, 1))+
ylim(0,15)+
ylab("Tasas") +
xlab("Plazo") +
ggtitle("Curvas de rendimientos por año y trimestre - Mediano Plazo")+
facet_grid(trimestre~anno)

datos %>%
filter(plazo=="Largo") %>%
ggplot(aes(x = plazo_en_anos, y = tasa_percent, color = as.factor(fecha))) +
geom_line() +
scale_color_manual(values = grDevices::colorRampPalette(RColorBrewer::brewer.pal(8, "Dark2"))(257)) +
theme(legend.position = "none",
plot.title = element_text(hjust = 0.5)) +
scale_x_continuous(breaks=seq(0, 10, 1))+
ylim(0,15)+
ylab("Tasas") +
xlab("Plazo") +
ggtitle("Curvas de rendimientos por año y trimestre - Largo plazo")+
facet_grid(trimestre~anno)

Curvas por año y mes
datos %>%
filter(plazo=="Corto") %>%
ggplot(aes(x = plazo_en_anos, y = tasa_percent, color = as.factor(fecha))) +
geom_line() +
scale_color_manual(values = grDevices::colorRampPalette(RColorBrewer::brewer.pal(8, "Dark2"))(257)) +
theme(legend.position = "none",
plot.title = element_text(hjust = 0.5)) +
scale_x_continuous(breaks=seq(0, 10, 1))+
ylim(0,15)+
ylab("Tasas") +
xlab("Plazo") +
ggtitle("Curvas de rendimientos por año y mes - Corto Plazo")+
facet_grid(mes~anno)

datos %>%
filter(plazo=="Mediano") %>%
ggplot(aes(x = plazo_en_anos, y = tasa_percent, color = as.factor(fecha))) +
geom_line() +
scale_color_manual(values = grDevices::colorRampPalette(RColorBrewer::brewer.pal(8, "Dark2"))(257)) +
theme(legend.position = "none",
plot.title = element_text(hjust = 0.5)) +
scale_x_continuous(breaks=seq(0, 10, 1))+
ylim(0,15)+
ylab("Tasas") +
xlab("Plazo") +
ggtitle("Curvas de rendimientos por año y mes - Mediano Plazo")+
facet_grid(mes~anno)

datos %>%
filter(plazo=="Largo") %>%
ggplot(aes(x = plazo_en_anos, y = tasa_percent, color = as.factor(fecha))) +
geom_line() +
scale_color_manual(values = grDevices::colorRampPalette(RColorBrewer::brewer.pal(8, "Dark2"))(257)) +
theme(legend.position = "none",
plot.title = element_text(hjust = 0.5)) +
scale_x_continuous(breaks=seq(0, 10, 1))+
ylim(0,15)+
ylab("Tasas") +
xlab("Plazo") +
ggtitle("Curvas de rendimientos por año y mes - Largo plazo")+
facet_grid(mes~anno)

Variabilidad y volatilidad
Variabilidad
datos2<-datos %>%
group_by(semana_rango) %>%
mutate(tasa_ant=lag(tasa_percent,1),
variab=log(tasa_percent/tasa_ant))
datos2 %>%
ggplot(aes(x = plazo_en_anos, y = variab, color = as.factor(fecha))) +
geom_line() +
scale_color_manual(values = grDevices::colorRampPalette(RColorBrewer::brewer.pal(8, "Dark2"))(257)) +
theme(legend.position = "none",
plot.title = element_text(hjust = 0.5)) +
scale_x_continuous(breaks=seq(0, 10, 1))+
ylim(-0.001,0.03)+
ylab("Variabilidad") +
xlab("Plazo") +
ggtitle("Variabilidad curvas de tasas por semana - Todos los plazos")

datos2 %>%
ggplot(aes(x = plazo_en_anos, y = variab, color = as.factor(fecha))) +
geom_line() +
scale_color_manual(values = grDevices::colorRampPalette(RColorBrewer::brewer.pal(8, "Dark2"))(257)) +
theme(legend.position = "none",
plot.title = element_text(hjust = 0.5)) +
scale_x_continuous(breaks=seq(0, 10, 1))+
ylim(-0.001,0.03)+
ylab("Variabilidad") +
xlab("Plazo") +
ggtitle("Variabilidad curvas de tasas por semana - Todos los plazos")+
facet_grid(~anno)

datos2 %>%
ggplot(aes(x = plazo_en_anos, y = variab, color = as.factor(fecha))) +
geom_line() +
scale_color_manual(values = grDevices::colorRampPalette(RColorBrewer::brewer.pal(8, "Dark2"))(257)) +
theme(legend.position = "none",
plot.title = element_text(hjust = 0.5)) +
scale_x_continuous(breaks=seq(0, 10, 1))+
ylim(-0.001,0.03)+
ylab("Variabilidad") +
xlab("Plazo") +
ggtitle("Variabilidad curvas de tasas por semana y plazo")+
facet_grid(~plazo)

datos2 %>%
filter(plazo=="Corto") %>%
ggplot(aes(x = plazo_en_anos, y = variab, color = as.factor(fecha))) +
geom_line() +
scale_color_manual(values = grDevices::colorRampPalette(RColorBrewer::brewer.pal(8, "Dark2"))(257)) +
theme(legend.position = "none",
plot.title = element_text(hjust = 0.5)) +
scale_x_continuous(breaks=seq(0, 10, 1))+
ylim(-0.001,0.03)+
ylab("Variabilidad") +
xlab("Plazo") +
ggtitle("Variabilidad curvas de tasas por semana - Corto Plazo")+
facet_grid(~anno)

datos2 %>%
filter(plazo=="Mediano") %>%
ggplot(aes(x = plazo_en_anos, y = variab, color = as.factor(fecha))) +
geom_line() +
scale_color_manual(values = grDevices::colorRampPalette(RColorBrewer::brewer.pal(8, "Dark2"))(257)) +
theme(legend.position = "none",
plot.title = element_text(hjust = 0.5)) +
scale_x_continuous(breaks=seq(0, 10, 1))+
ylim(-0.001,0.03)+
ylab("Variabilidad") +
xlab("Plazo") +
ggtitle("Variabilidad curvas de tasas por semana - Mediano Plazo")+
facet_grid(~anno)

datos2 %>%
filter(plazo=="Largo") %>%
ggplot(aes(x = plazo_en_anos, y = variab, color = as.factor(fecha))) +
geom_line() +
scale_color_manual(values = grDevices::colorRampPalette(RColorBrewer::brewer.pal(8, "Dark2"))(257)) +
theme(legend.position = "none",
plot.title = element_text(hjust = 0.5)) +
scale_x_continuous(breaks=seq(0, 10, 1))+
ylim(-0.001,0.03)+
ylab("Variabilidad") +
xlab("Plazo") +
ggtitle("Variabilidad curvas de tasas por semana - Largo Plazo")+
facet_grid(~anno)

NA
NA
Volatilidad
General
#volatilidad por semana
datos4<-datos3 %>%
group_by(semana_rango,fecha,semana,mes,trimestre,anno,GRP) %>%
summarise(
desv=sd(variab,na.rm = TRUE)
)
`summarise()` regrouping output by 'semana_rango', 'fecha', 'semana', 'mes', 'trimestre', 'anno' (override with `.groups` argument)
#volatilidad por semana
datos4<-datos3 %>%
group_by(semana_rango,fecha,semana,mes,trimestre,anno,GRP) %>%
summarise(
desv=sd(variab,na.rm = TRUE)
)
`summarise()` regrouping output by 'semana_rango', 'fecha', 'semana', 'mes', 'trimestre', 'anno' (override with `.groups` argument)
datos4 %>%
ggplot(aes(x = GRP, y = desv, color = as.factor(fecha))) +
geom_line() +
scale_color_manual(values = grDevices::colorRampPalette(RColorBrewer::brewer.pal(8, "Dark2"))(257)) +
theme(legend.position = "none",
plot.title = element_text(hjust = 0.5)) +
ylim(-0.00001,0.01)+
ylab("Volatilidad") +
xlab("") +
ggtitle("Volatilidad curvas de tasas por semana - Todos los plazos")

datos4 %>%
ggplot(aes(x = GRP, y = desv, color = as.factor(fecha))) +
geom_line() +
scale_color_manual(values = grDevices::colorRampPalette(RColorBrewer::brewer.pal(8, "Dark2"))(257)) +
theme(legend.position = "none",
plot.title = element_text(hjust = 0.5)) +
ylim(-0.00001,0.01)+
ylab("Volatilidad") +
xlab("") +
ggtitle("Volatilidad curvas de tasas por semana - Todos los plazos")+
facet_grid(~anno)

#Volatilidad por plazo
datos5<-datos3 %>%
group_by(semana_rango,fecha,semana,mes,trimestre,anno,plazo,GRP) %>%
summarise(
desv=sd(variab,na.rm = TRUE)
)
`summarise()` regrouping output by 'semana_rango', 'fecha', 'semana', 'mes', 'trimestre', 'anno', 'plazo' (override with `.groups` argument)
datos5 %>%
ggplot(aes(x = GRP, y = desv, color = as.factor(fecha))) +
geom_line() +
scale_color_manual(values = grDevices::colorRampPalette(RColorBrewer::brewer.pal(8, "Dark2"))(257)) +
theme(legend.position = "none",
plot.title = element_text(hjust = 0.5)) +
ylim(-0.00001,0.01)+
ylab("Volatilidad") +
xlab("") +
ggtitle("Volatilidad curvas de tasas por semana y plazos")+
facet_grid(~plazo)

datos5 %>%
filter(plazo=="Corto") %>%
ggplot(aes(x = GRP, y = desv, color = as.factor(fecha))) +
geom_line() +
scale_color_manual(values = grDevices::colorRampPalette(RColorBrewer::brewer.pal(8, "Dark2"))(257)) +
theme(legend.position = "none",
plot.title = element_text(hjust = 0.5)) +
ylim(-0.00001,0.01)+
ylab("Volatilidad") +
xlab(" ") +
ggtitle("Volatilidad curvas de tasas por semana - Corto Plazo")+
facet_grid(~anno)

datos5 %>%
filter(plazo=="Mediano") %>%
ggplot(aes(x = GRP, y = desv, color = as.factor(fecha))) +
geom_line() +
scale_color_manual(values = grDevices::colorRampPalette(RColorBrewer::brewer.pal(8, "Dark2"))(257)) +
theme(legend.position = "none",
plot.title = element_text(hjust = 0.5)) +
ylim(-0.00001,0.01)+
ylab("Volatilidad") +
xlab(" ") +
ggtitle("Volatilidad curvas de tasas por semana - Mediano Plazo")+
facet_grid(~anno)

datos5 %>%
filter(plazo=="Largo") %>%
ggplot(aes(x = GRP, y = desv, color = as.factor(fecha))) +
geom_line() +
scale_color_manual(values = grDevices::colorRampPalette(RColorBrewer::brewer.pal(8, "Dark2"))(257)) +
theme(legend.position = "none",
plot.title = element_text(hjust = 0.5)) +
ylim(-0.00001,0.01)+
ylab("Volatilidad") +
xlab(" ") +
ggtitle("Volatilidad curvas de tasas por semana - Largo Plazo")+
facet_grid(~anno)

NA
NA
NA
LS0tCnRpdGxlOiAiUiBOb3RlYm9vayIKb3V0cHV0OiBodG1sX25vdGVib29rCi0tLQoKYGBge3IsbWVzc2FnZT1GQUxTRX0KbGlicmFyeShoZXJlKQpsaWJyYXJ5KGphbml0b3IpCmxpYnJhcnkoc3RyaW5ncikKbGlicmFyeShyZWFkeGwpCmxpYnJhcnkoa2FibGVFeHRyYSkKbGlicmFyeSh0aWR5dmVyc2UpCmBgYAoKUnV0YXMKYGBge3J9CgpyYXdfZGF0YSA8LSBoZXJlKCJkYXRhIiwgInJhdyIpCmludGVyaW1fZGF0YSA8LSBoZXJlKCJkYXRhIiwgImludGVyaW0iKQpwcm9jZXNzZWRfZGF0YSA8LSBoZXJlKCJkYXRhIiwgInByb2Nlc3NlZCIpCgpgYGAKCkNhcmdhbmRvIGRhdG9zCgpgYGB7cn0KCmRhdG9zID0gcmVhZFJEUyhwYXN0ZTAocHJvY2Vzc2VkX2RhdGEsICIvZGF0b3NfdGFzYV9FREEuUmRzIikpCmRhdG9zX2xvbmcgPSByZWFkUkRTKHBhc3RlMChwcm9jZXNzZWRfZGF0YSwgIi9kYXRvc190YXNhLlJkcyIpKQoKI3F1aXRhciBwYWxhYmFyYSBwbGF6byBwYXJhIHZpc3VhbGl6YXIgbWVqb3IKZGF0b3MkcGxhem88LWdzdWIoIiBwbGF6byIsIiIsZGF0b3MkcGxhem8pCmRhdG9zJHBsYXpvPC0gZmFjdG9yKGRhdG9zJHBsYXpvLGxldmVscyA9IGMoIkNvcnRvIiwgIk1lZGlhbm8iLCJMYXJnbyIgKSkKCmhlYWQoZGF0b3MpCmBgYAoKIyBFeHBsb3JhY2lvbiBkZSBkYXRvcwoKIyNFeHBsb3JhY2nDs24gZGUgbGFzIGN1cnZhcwoKIyMgRXhwbG9yYWNpb24gcG9yIHBsYXpvCgpgYGB7cn0KCmRhdG9zICU+JSAKICBncm91cF9ieShwbGF6bykgJT4lIAogIHN1bW1hcmlzZSh0YXNhX3Byb20gPSBtZWFuKHRhc2FfcGVyY2VudCksCiAgICAgICAgICAgIHRhc2FfbWVkaWFuYSA9IG1lZGlhbih0YXNhX3BlcmNlbnQpLAogICAgICAgICAgICB0YXNhX21pbiA9IG1pbih0YXNhX3BlcmNlbnQpLAogICAgICAgICAgICB0YXNhX21heCA9IG1heCh0YXNhX3BlcmNlbnQpLAogICAgICAgICAgICB0YXNhX3NkID0gc2QodGFzYV9wZXJjZW50KSkKCgoKZGF0b3MgJT4lCiAgZ2dwbG90KGFlcyh4ID0gcGxhem8sIHkgPSB0YXNhX3BlcmNlbnQsIGZpbGwgPSBwbGF6bykpICsKICBnZW9tX2JveHBsb3QoKSsKICBzdGF0X3N1bW1hcnkoZnVuPW1lYW4sIGdlb209InBvaW50Iiwgc2hhcGU9MjAsIHNpemU9MywgY29sb3I9InJlZCIsIGZpbGw9InJlZCIpICsKICBzY2FsZV9maWxsX2JyZXdlcihwYWxldHRlID0gIkRhcmsyIikgKwogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIiwKICAgICAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMC41KSkgKwogIHlsaW0oMCwxNSkrCiAgeWxhYigiVGFzYXMiKSArCiAgeGxhYigiUGxhem8iKSArCiAgZ2d0aXRsZSgiVGFzYXMgcG9yIHBsYXpvIikKICAgCgoKYGBgCkNsYXJhbWVudGUsIGEgbWF5b3IgcGxhem8gbWF5b3IgZXMgZWwgcHJvbWVkaW8geSBtZWRpYW5hIGRlIGxvcyByZW5kaW1pZW50b3MuCgoKCmBgYHtyfQoKZGF0b3MgJT4lCiAgZ2dwbG90KGFlcyh4ID0gYW5ubywgeSA9IHRhc2FfcGVyY2VudCwgZmlsbCA9IHBsYXpvKSkgKwogIGdlb21fYm94cGxvdCgpKwogIHN0YXRfc3VtbWFyeShmdW49bWVhbiwgZ2VvbT0icG9pbnQiLCBzaGFwZT0yMCwgc2l6ZT0zLCBjb2xvcj0icmVkIiwgZmlsbD0icmVkIikgKwogIHNjYWxlX2ZpbGxfYnJld2VyKHBhbGV0dGUgPSAiRGFyazIiKSArCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiLAogICAgICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoaGp1c3QgPSAwLjUpKSArCiAgeWxpbSgwLDE1KSsKICB5bGFiKCJUYXNhcyIpICsKICB4bGFiKCJBw7FvIikgKwogIGdndGl0bGUoIlRhc2FzIHBvciBwbGF6byB5IGHDsW8iKSsKICBmYWNldF9ncmlkKH5wbGF6bykKICAgCgoKYGBgCgoKCkFsIHZlciBsYXMgdGFzYXMgcG9yIHBsYXpvIHkgYcOxbyBzZSBvYnNlcnZhIGNvbiBtYXMgZGV0YWxsZSBxdWUgZWwgMjAxOCB5IDIwMTkgZnVlcm9uIGxvcyBhw7FvcyAKY29uIG1heW9yZXMgdGFzYXMgZW4gdG9kb3MgbG9zIHBsYXpvcy4gRWwgMjAyMCBlbiBjYW1iaW8gdGllbmUgbGFzIG1hcyBiYWphcyB5IGEgY29ydG8gcGxhem8gZXMgZWwgcXVlIHRpZW5lIGxhcyBtYXMgYmFqYXMgZGUgdG9kbyBlbCBwZXJpb2RvIGFuYWxpemFkby4gCgoKCmBgYHtyfQoKZGF0b3MgJT4lCiAgZ2dwbG90KGFlcyh4ID0gdHJpbWVzdHJlLCB5ID0gdGFzYV9wZXJjZW50LCBmaWxsID0gcGxhem8pKSArCiAgZ2VvbV9ib3hwbG90KCkrCiAgc3RhdF9zdW1tYXJ5KGZ1bj1tZWFuLCBnZW9tPSJwb2ludCIsIHNoYXBlPTIwLCBzaXplPTEsIGNvbG9yPSJyZWQiLCBmaWxsPSJyZWQiKSArCiAgc2NhbGVfZmlsbF9icmV3ZXIocGFsZXR0ZSA9ICJEYXJrMiIpICsKICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIsCiAgICAgICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAuNSkpICsKICB5bGltKDAsMTUpKwogIHlsYWIoIlRhc2FzIikgKwogIHhsYWIoIlRyaW1lc3RyZSIpICsKICBnZ3RpdGxlKCJUYXNhcyBwb3IgcGxhem8geSBhw7FvIikrCiAgZmFjZXRfZ3JpZChwbGF6b35hbm5vKQogICAKCgpgYGAKCgoKYGBge3J9CgpkYXRvcyAlPiUKICBnZ3Bsb3QoYWVzKHggPSBtZXMsIHkgPSB0YXNhX3BlcmNlbnQsIGZpbGwgPSBwbGF6bykpICsKICBnZW9tX2JveHBsb3QoKSsKICBzdGF0X3N1bW1hcnkoZnVuPW1lYW4sIGdlb209InBvaW50Iiwgc2hhcGU9MjAsIHNpemU9MC41LCBjb2xvcj0icmVkIiwgZmlsbD0icmVkIikgKwogIHNjYWxlX2ZpbGxfYnJld2VyKHBhbGV0dGUgPSAiRGFyazIiKSArCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiLAogICAgICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoaGp1c3QgPSAwLjUpKSArCiAgeWxpbSgwLDE1KSsKICB5bGFiKCJUYXNhcyIpICsKICB4bGFiKCJNZXMiKSArCiAgZ2d0aXRsZSgiVGFzYXMgcG9yIHBsYXpvIHkgYcOxbyIpKwogIGZhY2V0X2dyaWQocGxhem9+YW5ubykKICAgCgoKYGBgCgoKCgojIEV4cGxvcmFjacOzbiBwb3IgY3VydmFzCgojI0N1cnZhcyBwb3IgYcOxbwoKYGBge3J9CgpkYXRvcyAlPiUKICBmaWx0ZXIocGxhem89PSJDb3J0byIpICU+JSAKICBnZ3Bsb3QoYWVzKHggPSBwbGF6b19lbl9hbm9zLCB5ID0gdGFzYV9wZXJjZW50LCBjb2xvciA9IGFzLmZhY3RvcihmZWNoYSkpKSArCiAgZ2VvbV9saW5lKCkgKwogIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXMgPSBnckRldmljZXM6OmNvbG9yUmFtcFBhbGV0dGUoUkNvbG9yQnJld2VyOjpicmV3ZXIucGFsKDgsICJEYXJrMiIpKSgyNTcpKSArCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiLAogICAgICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoaGp1c3QgPSAwLjUpKSArCiAgc2NhbGVfeF9jb250aW51b3VzKGJyZWFrcz1zZXEoMCwgMTAsIDEpKSsKICB5bGltKDAsMTUpKwogIHlsYWIoIlRhc2FzIikgKwogIHhsYWIoIlBsYXpvIikgKwogIGdndGl0bGUoIkN1cnZhcyBkZSByZW5kaW1pZW50b3MgcG9yIGHDsW8gLSBDb3J0byBQbGF6byIpKwogIGZhY2V0X2dyaWQofmFubm8pCgoKZGF0b3MgJT4lCiAgZmlsdGVyKHBsYXpvPT0iTWVkaWFubyIpICU+JSAKICBnZ3Bsb3QoYWVzKHggPSBwbGF6b19lbl9hbm9zLCB5ID0gdGFzYV9wZXJjZW50LCBjb2xvciA9IGFzLmZhY3RvcihmZWNoYSkpKSArCiAgZ2VvbV9saW5lKCkgKwogIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXMgPSBnckRldmljZXM6OmNvbG9yUmFtcFBhbGV0dGUoUkNvbG9yQnJld2VyOjpicmV3ZXIucGFsKDgsICJEYXJrMiIpKSgyNTcpKSArCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiLAogICAgICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoaGp1c3QgPSAwLjUpKSArCiAgc2NhbGVfeF9jb250aW51b3VzKGJyZWFrcz1zZXEoMCwgMTAsIDEpKSsKICB5bGltKDAsMTUpKwogIHlsYWIoIlRhc2FzIikgKwogIHhsYWIoIlBsYXpvIikgKwogIGdndGl0bGUoIkN1cnZhcyBkZSByZW5kaW1pZW50b3MgcG9yIGHDsW8gLSBNZWRpYW5vIFBsYXpvIikrCiAgZmFjZXRfZ3JpZCh+YW5ubykKICAKCgpkYXRvcyAlPiUKICBmaWx0ZXIocGxhem89PSJMYXJnbyIpICU+JSAKICBnZ3Bsb3QoYWVzKHggPSBwbGF6b19lbl9hbm9zLCB5ID0gdGFzYV9wZXJjZW50LCBjb2xvciA9IGFzLmZhY3RvcihmZWNoYSkpKSArCiAgZ2VvbV9saW5lKCkgKwogIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXMgPSBnckRldmljZXM6OmNvbG9yUmFtcFBhbGV0dGUoUkNvbG9yQnJld2VyOjpicmV3ZXIucGFsKDgsICJEYXJrMiIpKSgyNTcpKSArCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiLAogICAgICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoaGp1c3QgPSAwLjUpKSArCiAgc2NhbGVfeF9jb250aW51b3VzKGJyZWFrcz1zZXEoMCwgMTAsIDEpKSsKICB5bGltKDAsMTUpKwogIHlsYWIoIlRhc2FzIikgKwogIHhsYWIoIlBsYXpvIikgKwogIGdndGl0bGUoIkN1cnZhcyBkZSByZW5kaW1pZW50b3MgcG9yIGHDsW8gLSBMYXJnbyBwbGF6byIpKwogIGZhY2V0X2dyaWQofmFubm8pCgpgYGAKClBhcmEgZWwgY29ydG8geSBtZWRpYW5vIHBsYXpvLCBhbCB2ZXIgbGFzIGN1cnZhcyBwb3IgYcOxbyBzZSBhcHJlY2lhIHF1ZSBkZSBsb3MgYcOxb3MgMjAxNyBhbCAyMDE5IHNlIHRpZW5lbiBsYXMgdGFzYXMgbWFzIGFsdGFzLiBMYXMgdGFzYXMgZGVsIDIwMjAgc29uIG3DoXMgYmFqYXMuCgoKIyNDdXJ2YXMgcG9yIG1lcwoKYGBge3J9CgpkYXRvcyAlPiUKICBmaWx0ZXIocGxhem89PSJDb3J0byIpICU+JSAKICBnZ3Bsb3QoYWVzKHggPSBwbGF6b19lbl9hbm9zLCB5ID0gdGFzYV9wZXJjZW50LCBjb2xvciA9IGFzLmZhY3RvcihmZWNoYSkpKSArCiAgZ2VvbV9saW5lKCkgKwogIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXMgPSBnckRldmljZXM6OmNvbG9yUmFtcFBhbGV0dGUoUkNvbG9yQnJld2VyOjpicmV3ZXIucGFsKDgsICJEYXJrMiIpKSgyNTcpKSArCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiLAogICAgICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoaGp1c3QgPSAwLjUpKSArCiAgc2NhbGVfeF9jb250aW51b3VzKGJyZWFrcz1zZXEoMCwgMTAsIDEpKSsKICB5bGltKDAsMTUpKwogIHlsYWIoIlRhc2FzIikgKwogIHhsYWIoIlBsYXpvIikgKwogIGdndGl0bGUoIkN1cnZhcyBkZSByZW5kaW1pZW50b3MgcG9yIG1lcyAtIENvcnRvIFBsYXpvIikrCiAgZmFjZXRfZ3JpZCh+bWVzKQoKCmRhdG9zICU+JQogIGZpbHRlcihwbGF6bz09Ik1lZGlhbm8iKSAlPiUgCiAgZ2dwbG90KGFlcyh4ID0gcGxhem9fZW5fYW5vcywgeSA9IHRhc2FfcGVyY2VudCwgY29sb3IgPSBhcy5mYWN0b3IoZmVjaGEpKSkgKwogIGdlb21fbGluZSgpICsKICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzID0gZ3JEZXZpY2VzOjpjb2xvclJhbXBQYWxldHRlKFJDb2xvckJyZXdlcjo6YnJld2VyLnBhbCg4LCAiRGFyazIiKSkoMjU3KSkgKwogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIiwKICAgICAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMC41KSkgKwogIHNjYWxlX3hfY29udGludW91cyhicmVha3M9c2VxKDAsIDEwLCAxKSkrCiAgeWxpbSgwLDE1KSsKICB5bGFiKCJUYXNhcyIpICsKICB4bGFiKCJQbGF6byIpICsKICBnZ3RpdGxlKCJDdXJ2YXMgZGUgcmVuZGltaWVudG9zIHBvciBtZXMgLSBNZWRpYW5vIFBsYXpvIikrCiAgZmFjZXRfZ3JpZCh+bWVzKQogIAoKCmRhdG9zICU+JQogIGZpbHRlcihwbGF6bz09IkxhcmdvIikgJT4lIAogIGdncGxvdChhZXMoeCA9IHBsYXpvX2VuX2Fub3MsIHkgPSB0YXNhX3BlcmNlbnQsIGNvbG9yID0gYXMuZmFjdG9yKGZlY2hhKSkpICsKICBnZW9tX2xpbmUoKSArCiAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcyA9IGdyRGV2aWNlczo6Y29sb3JSYW1wUGFsZXR0ZShSQ29sb3JCcmV3ZXI6OmJyZXdlci5wYWwoOCwgIkRhcmsyIikpKDI1NykpICsKICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIsCiAgICAgICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAuNSkpICsKICBzY2FsZV94X2NvbnRpbnVvdXMoYnJlYWtzPXNlcSgwLCAxMCwgMSkpKwogIHlsaW0oMCwxNSkrCiAgeWxhYigiVGFzYXMiKSArCiAgeGxhYigiUGxhem8iKSArCiAgZ2d0aXRsZSgiQ3VydmFzIGRlIHJlbmRpbWllbnRvcyBwb3IgbWVzIC0gTGFyZ28gcGxhem8iKSsKICBmYWNldF9ncmlkKH5tZXMpCgpgYGAKCgojI0N1cnZhcyBwb3IgdHJpbWVzdHJlCgpgYGB7cn0KCmRhdG9zICU+JQogIGZpbHRlcihwbGF6bz09IkNvcnRvIikgJT4lIAogIGdncGxvdChhZXMoeCA9IHBsYXpvX2VuX2Fub3MsIHkgPSB0YXNhX3BlcmNlbnQsIGNvbG9yID0gYXMuZmFjdG9yKGZlY2hhKSkpICsKICBnZW9tX2xpbmUoKSArCiAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcyA9IGdyRGV2aWNlczo6Y29sb3JSYW1wUGFsZXR0ZShSQ29sb3JCcmV3ZXI6OmJyZXdlci5wYWwoOCwgIkRhcmsyIikpKDI1NykpICsKICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIsCiAgICAgICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAuNSkpICsKICBzY2FsZV94X2NvbnRpbnVvdXMoYnJlYWtzPXNlcSgwLCAxMCwgMSkpKwogIHlsaW0oMCwxNSkrCiAgeWxhYigiVGFzYXMiKSArCiAgeGxhYigiUGxhem8iKSArCiAgZ2d0aXRsZSgiQ3VydmFzIGRlIHJlbmRpbWllbnRvcyBwb3IgdHJpbWVzdHJlIC0gQ29ydG8gUGxhem8iKSsKICBmYWNldF9ncmlkKH50cmltZXN0cmUpCgoKZGF0b3MgJT4lCiAgZmlsdGVyKHBsYXpvPT0iTWVkaWFubyIpICU+JSAKICBnZ3Bsb3QoYWVzKHggPSBwbGF6b19lbl9hbm9zLCB5ID0gdGFzYV9wZXJjZW50LCBjb2xvciA9IGFzLmZhY3RvcihmZWNoYSkpKSArCiAgZ2VvbV9saW5lKCkgKwogIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXMgPSBnckRldmljZXM6OmNvbG9yUmFtcFBhbGV0dGUoUkNvbG9yQnJld2VyOjpicmV3ZXIucGFsKDgsICJEYXJrMiIpKSgyNTcpKSArCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiLAogICAgICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoaGp1c3QgPSAwLjUpKSArCiAgc2NhbGVfeF9jb250aW51b3VzKGJyZWFrcz1zZXEoMCwgMTAsIDEpKSsKICB5bGltKDAsMTUpKwogIHlsYWIoIlRhc2FzIikgKwogIHhsYWIoIlBsYXpvIikgKwogIGdndGl0bGUoIkN1cnZhcyBkZSByZW5kaW1pZW50b3MgcG9yIHRyaW1lc3RyZSAtIE1lZGlhbm8gUGxhem8iKSsKICBmYWNldF9ncmlkKH50cmltZXN0cmUpCiAgCgoKZGF0b3MgJT4lCiAgZmlsdGVyKHBsYXpvPT0iTGFyZ28iKSAlPiUgCiAgZ2dwbG90KGFlcyh4ID0gcGxhem9fZW5fYW5vcywgeSA9IHRhc2FfcGVyY2VudCwgY29sb3IgPSBhcy5mYWN0b3IoZmVjaGEpKSkgKwogIGdlb21fbGluZSgpICsKICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzID0gZ3JEZXZpY2VzOjpjb2xvclJhbXBQYWxldHRlKFJDb2xvckJyZXdlcjo6YnJld2VyLnBhbCg4LCAiRGFyazIiKSkoMjU3KSkgKwogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIiwKICAgICAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMC41KSkgKwogIHNjYWxlX3hfY29udGludW91cyhicmVha3M9c2VxKDAsIDEwLCAxKSkrCiAgeWxpbSgwLDE1KSsKICB5bGFiKCJUYXNhcyIpICsKICB4bGFiKCJQbGF6byIpICsKICBnZ3RpdGxlKCJDdXJ2YXMgZGUgcmVuZGltaWVudG9zIHBvciB0cmltZXN0cmUgLSBMYXJnbyBwbGF6byIpKwogIGZhY2V0X2dyaWQofnRyaW1lc3RyZSkKCmBgYAoKCgojIyBDdXJ2YXMgcG9yIHNlbWFuYQpgYGB7cn0KCmRhdG9zICU+JQogIGZpbHRlcihwbGF6bz09IkNvcnRvIikgJT4lIAogIGdncGxvdChhZXMoeCA9IHBsYXpvX2VuX2Fub3MsIHkgPSB0YXNhX3BlcmNlbnQsIGNvbG9yID0gYXMuZmFjdG9yKGZlY2hhKSkpICsKICBnZW9tX2xpbmUoKSArCiAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcyA9IGdyRGV2aWNlczo6Y29sb3JSYW1wUGFsZXR0ZShSQ29sb3JCcmV3ZXI6OmJyZXdlci5wYWwoOCwgIkRhcmsyIikpKDI1NykpICsKICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIsCiAgICAgICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAuNSkpICsKICBzY2FsZV94X2NvbnRpbnVvdXMoYnJlYWtzPXNlcSgwLCAxMCwgMSkpKwogIHlsaW0oMCwxNSkrCiAgeWxhYigiVGFzYXMiKSArCiAgeGxhYigiUGxhem8iKSArCiAgZ2d0aXRsZSgiQ3VydmFzIGRlIHRhc2FzIHBvciBzZW1hbmEgLSBDb3J0byBQbGF6byIpCgoKZGF0b3MgJT4lCiAgZmlsdGVyKHBsYXpvPT0iTWVkaWFubyIpICU+JSAKICBnZ3Bsb3QoYWVzKHggPSBwbGF6b19lbl9hbm9zLCB5ID0gdGFzYV9wZXJjZW50LCBjb2xvciA9IGFzLmZhY3RvcihmZWNoYSkpKSArCiAgZ2VvbV9saW5lKCkgKwogIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXMgPSBnckRldmljZXM6OmNvbG9yUmFtcFBhbGV0dGUoUkNvbG9yQnJld2VyOjpicmV3ZXIucGFsKDgsICJEYXJrMiIpKSgyNTcpKSArCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiLAogICAgICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoaGp1c3QgPSAwLjUpKSArCiAgc2NhbGVfeF9jb250aW51b3VzKGJyZWFrcz1zZXEoMCwgMTAsIDEpKSsKICB5bGltKDAsMTUpKwogIHlsYWIoIlRhc2FzIikgKwogIHhsYWIoIlBsYXpvIikgKwogIGdndGl0bGUoIkN1cnZhcyBkZSB0YXNhcyBwb3Igc2VtYW5hIC0gTWVkaWFubyBQbGF6byIpCiAgCgoKZGF0b3MgJT4lCiAgZmlsdGVyKHBsYXpvPT0iTGFyZ28iKSAlPiUgCiAgZ2dwbG90KGFlcyh4ID0gcGxhem9fZW5fYW5vcywgeSA9IHRhc2FfcGVyY2VudCwgY29sb3IgPSBhcy5mYWN0b3IoZmVjaGEpKSkgKwogIGdlb21fbGluZSgpICsKICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzID0gZ3JEZXZpY2VzOjpjb2xvclJhbXBQYWxldHRlKFJDb2xvckJyZXdlcjo6YnJld2VyLnBhbCg4LCAiRGFyazIiKSkoMjU3KSkgKwogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIiwKICAgICAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMC41KSkgKwogIHNjYWxlX3hfY29udGludW91cyhicmVha3M9c2VxKDAsIDEwLCAxKSkrCiAgeWxpbSgwLDE1KSsKICB5bGFiKCJUYXNhcyIpICsKICB4bGFiKCJQbGF6byIpICsKICBnZ3RpdGxlKCJDdXJ2YXMgZGUgdGFzYXMgcG9yIHNlbWFuYSAtIExhcmdvIHBsYXpvIikKCmBgYAoKCiMjIEN1cnZhcyBwb3IgYcOxbyB5IHRyaW1lc3RyZXMKCmBgYHtyfQoKZGF0b3MgJT4lCiAgZmlsdGVyKHBsYXpvPT0iQ29ydG8iKSAlPiUgCiAgZ2dwbG90KGFlcyh4ID0gcGxhem9fZW5fYW5vcywgeSA9IHRhc2FfcGVyY2VudCwgY29sb3IgPSBhcy5mYWN0b3IoZmVjaGEpKSkgKwogIGdlb21fbGluZSgpICsKICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzID0gZ3JEZXZpY2VzOjpjb2xvclJhbXBQYWxldHRlKFJDb2xvckJyZXdlcjo6YnJld2VyLnBhbCg4LCAiRGFyazIiKSkoMjU3KSkgKwogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIiwKICAgICAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMC41KSkgKwogIHNjYWxlX3hfY29udGludW91cyhicmVha3M9c2VxKDAsIDEwLCAxKSkrCiAgeWxpbSgwLDE1KSsKICB5bGFiKCJUYXNhcyIpICsKICB4bGFiKCJQbGF6byIpICsKICBnZ3RpdGxlKCJDdXJ2YXMgZGUgcmVuZGltaWVudG9zIHBvciBhw7FvIHkgdHJpbWVzdHJlIC0gQ29ydG8gUGxhem8iKSsKICBmYWNldF9ncmlkKHRyaW1lc3RyZX5hbm5vKQoKCgpkYXRvcyAlPiUKICBmaWx0ZXIocGxhem89PSJNZWRpYW5vIikgJT4lIAogIGdncGxvdChhZXMoeCA9IHBsYXpvX2VuX2Fub3MsIHkgPSB0YXNhX3BlcmNlbnQsIGNvbG9yID0gYXMuZmFjdG9yKGZlY2hhKSkpICsKICBnZW9tX2xpbmUoKSArCiAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcyA9IGdyRGV2aWNlczo6Y29sb3JSYW1wUGFsZXR0ZShSQ29sb3JCcmV3ZXI6OmJyZXdlci5wYWwoOCwgIkRhcmsyIikpKDI1NykpICsKICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIsCiAgICAgICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAuNSkpICsKICBzY2FsZV94X2NvbnRpbnVvdXMoYnJlYWtzPXNlcSgwLCAxMCwgMSkpKwogIHlsaW0oMCwxNSkrCiAgeWxhYigiVGFzYXMiKSArCiAgeGxhYigiUGxhem8iKSArCiAgZ2d0aXRsZSgiQ3VydmFzIGRlIHJlbmRpbWllbnRvcyBwb3IgYcOxbyB5IHRyaW1lc3RyZSAtIE1lZGlhbm8gUGxhem8iKSsKICBmYWNldF9ncmlkKHRyaW1lc3RyZX5hbm5vKQogIAoKCmRhdG9zICU+JQogIGZpbHRlcihwbGF6bz09IkxhcmdvIikgJT4lIAogIGdncGxvdChhZXMoeCA9IHBsYXpvX2VuX2Fub3MsIHkgPSB0YXNhX3BlcmNlbnQsIGNvbG9yID0gYXMuZmFjdG9yKGZlY2hhKSkpICsKICBnZW9tX2xpbmUoKSArCiAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcyA9IGdyRGV2aWNlczo6Y29sb3JSYW1wUGFsZXR0ZShSQ29sb3JCcmV3ZXI6OmJyZXdlci5wYWwoOCwgIkRhcmsyIikpKDI1NykpICsKICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIsCiAgICAgICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAuNSkpICsKICBzY2FsZV94X2NvbnRpbnVvdXMoYnJlYWtzPXNlcSgwLCAxMCwgMSkpKwogIHlsaW0oMCwxNSkrCiAgeWxhYigiVGFzYXMiKSArCiAgeGxhYigiUGxhem8iKSArCiAgZ2d0aXRsZSgiQ3VydmFzIGRlIHJlbmRpbWllbnRvcyBwb3IgYcOxbyB5IHRyaW1lc3RyZSAtIExhcmdvIHBsYXpvIikrCiAgZmFjZXRfZ3JpZCh0cmltZXN0cmV+YW5ubykKCmBgYAoKCgoKCgojIyBDdXJ2YXMgcG9yIGHDsW8geSBtZXMKCmBgYHtyfQoKZGF0b3MgJT4lCiAgZmlsdGVyKHBsYXpvPT0iQ29ydG8iKSAlPiUgCiAgZ2dwbG90KGFlcyh4ID0gcGxhem9fZW5fYW5vcywgeSA9IHRhc2FfcGVyY2VudCwgY29sb3IgPSBhcy5mYWN0b3IoZmVjaGEpKSkgKwogIGdlb21fbGluZSgpICsKICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzID0gZ3JEZXZpY2VzOjpjb2xvclJhbXBQYWxldHRlKFJDb2xvckJyZXdlcjo6YnJld2VyLnBhbCg4LCAiRGFyazIiKSkoMjU3KSkgKwogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIiwKICAgICAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMC41KSkgKwogIHNjYWxlX3hfY29udGludW91cyhicmVha3M9c2VxKDAsIDEwLCAxKSkrCiAgeWxpbSgwLDE1KSsKICB5bGFiKCJUYXNhcyIpICsKICB4bGFiKCJQbGF6byIpICsKICBnZ3RpdGxlKCJDdXJ2YXMgZGUgcmVuZGltaWVudG9zIHBvciBhw7FvIHkgbWVzIC0gQ29ydG8gUGxhem8iKSsKICBmYWNldF9ncmlkKG1lc35hbm5vKQoKCgpkYXRvcyAlPiUKICBmaWx0ZXIocGxhem89PSJNZWRpYW5vIikgJT4lIAogIGdncGxvdChhZXMoeCA9IHBsYXpvX2VuX2Fub3MsIHkgPSB0YXNhX3BlcmNlbnQsIGNvbG9yID0gYXMuZmFjdG9yKGZlY2hhKSkpICsKICBnZW9tX2xpbmUoKSArCiAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcyA9IGdyRGV2aWNlczo6Y29sb3JSYW1wUGFsZXR0ZShSQ29sb3JCcmV3ZXI6OmJyZXdlci5wYWwoOCwgIkRhcmsyIikpKDI1NykpICsKICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIsCiAgICAgICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAuNSkpICsKICBzY2FsZV94X2NvbnRpbnVvdXMoYnJlYWtzPXNlcSgwLCAxMCwgMSkpKwogIHlsaW0oMCwxNSkrCiAgeWxhYigiVGFzYXMiKSArCiAgeGxhYigiUGxhem8iKSArCiAgZ2d0aXRsZSgiQ3VydmFzIGRlIHJlbmRpbWllbnRvcyBwb3IgYcOxbyB5IG1lcyAtIE1lZGlhbm8gUGxhem8iKSsKICBmYWNldF9ncmlkKG1lc35hbm5vKQogIAoKCmRhdG9zICU+JQogIGZpbHRlcihwbGF6bz09IkxhcmdvIikgJT4lIAogIGdncGxvdChhZXMoeCA9IHBsYXpvX2VuX2Fub3MsIHkgPSB0YXNhX3BlcmNlbnQsIGNvbG9yID0gYXMuZmFjdG9yKGZlY2hhKSkpICsKICBnZW9tX2xpbmUoKSArCiAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcyA9IGdyRGV2aWNlczo6Y29sb3JSYW1wUGFsZXR0ZShSQ29sb3JCcmV3ZXI6OmJyZXdlci5wYWwoOCwgIkRhcmsyIikpKDI1NykpICsKICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIsCiAgICAgICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAuNSkpICsKICBzY2FsZV94X2NvbnRpbnVvdXMoYnJlYWtzPXNlcSgwLCAxMCwgMSkpKwogIHlsaW0oMCwxNSkrCiAgeWxhYigiVGFzYXMiKSArCiAgeGxhYigiUGxhem8iKSArCiAgZ2d0aXRsZSgiQ3VydmFzIGRlIHJlbmRpbWllbnRvcyBwb3IgYcOxbyB5IG1lcyAtIExhcmdvIHBsYXpvIikrCiAgZmFjZXRfZ3JpZChtZXN+YW5ubykKCmBgYAoKIyMgVmFyaWFiaWxpZGFkIHkgdm9sYXRpbGlkYWQKCioqVmFyaWFiaWxpZGFkKioKCgotIFBsYXpvcyBwb3IgZmVjaGFzCgpgYGB7cn0KCmRhdG9zMjwtZGF0b3MgJT4lIAogIGdyb3VwX2J5KHNlbWFuYV9yYW5nbykgJT4lIAogIG11dGF0ZSh0YXNhX2FudD1sYWcodGFzYV9wZXJjZW50LDEpLAogICAgICAgICB2YXJpYWI9bG9nKHRhc2FfcGVyY2VudC90YXNhX2FudCkpCgpgYGAKCmBgYHtyfQoKZGF0b3MyICU+JQogIGdncGxvdChhZXMoeCA9IHBsYXpvX2VuX2Fub3MsIHkgPSB2YXJpYWIsIGNvbG9yID0gYXMuZmFjdG9yKGZlY2hhKSkpICsKICBnZW9tX2xpbmUoKSArCiAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcyA9IGdyRGV2aWNlczo6Y29sb3JSYW1wUGFsZXR0ZShSQ29sb3JCcmV3ZXI6OmJyZXdlci5wYWwoOCwgIkRhcmsyIikpKDI1NykpICsKICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIsCiAgICAgICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAuNSkpICsKICBzY2FsZV94X2NvbnRpbnVvdXMoYnJlYWtzPXNlcSgwLCAxMCwgMSkpKwogIHlsaW0oLTAuMDAxLDAuMDMpKwogIHlsYWIoIlZhcmlhYmlsaWRhZCIpICsKICB4bGFiKCJQbGF6byIpICsKICBnZ3RpdGxlKCJWYXJpYWJpbGlkYWQgY3VydmFzIGRlIHRhc2FzIHBvciBzZW1hbmEgLSBUb2RvcyBsb3MgcGxhem9zIikKCgpkYXRvczIgJT4lCiAgZ2dwbG90KGFlcyh4ID0gcGxhem9fZW5fYW5vcywgeSA9IHZhcmlhYiwgY29sb3IgPSBhcy5mYWN0b3IoZmVjaGEpKSkgKwogIGdlb21fbGluZSgpICsKICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzID0gZ3JEZXZpY2VzOjpjb2xvclJhbXBQYWxldHRlKFJDb2xvckJyZXdlcjo6YnJld2VyLnBhbCg4LCAiRGFyazIiKSkoMjU3KSkgKwogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIiwKICAgICAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMC41KSkgKwogIHNjYWxlX3hfY29udGludW91cyhicmVha3M9c2VxKDAsIDEwLCAxKSkrCiAgeWxpbSgtMC4wMDEsMC4wMykrCiAgeWxhYigiVmFyaWFiaWxpZGFkIikgKwogIHhsYWIoIlBsYXpvIikgKwogIGdndGl0bGUoIlZhcmlhYmlsaWRhZCBjdXJ2YXMgZGUgdGFzYXMgcG9yIHNlbWFuYSAtIFRvZG9zIGxvcyBwbGF6b3MiKSsKICBmYWNldF9ncmlkKH5hbm5vKQoKCgoKZGF0b3MyICU+JQogIGdncGxvdChhZXMoeCA9IHBsYXpvX2VuX2Fub3MsIHkgPSB2YXJpYWIsIGNvbG9yID0gYXMuZmFjdG9yKGZlY2hhKSkpICsKICBnZW9tX2xpbmUoKSArCiAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcyA9IGdyRGV2aWNlczo6Y29sb3JSYW1wUGFsZXR0ZShSQ29sb3JCcmV3ZXI6OmJyZXdlci5wYWwoOCwgIkRhcmsyIikpKDI1NykpICsKICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIsCiAgICAgICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAuNSkpICsKICBzY2FsZV94X2NvbnRpbnVvdXMoYnJlYWtzPXNlcSgwLCAxMCwgMSkpKwogIHlsaW0oLTAuMDAxLDAuMDMpKwogIHlsYWIoIlZhcmlhYmlsaWRhZCIpICsKICB4bGFiKCJQbGF6byIpICsKICBnZ3RpdGxlKCJWYXJpYWJpbGlkYWQgY3VydmFzIGRlIHRhc2FzIHBvciBzZW1hbmEgeSBwbGF6byIpKwogIGZhY2V0X2dyaWQofnBsYXpvKQoKCmRhdG9zMiAlPiUKICBmaWx0ZXIocGxhem89PSJDb3J0byIpICU+JSAKICBnZ3Bsb3QoYWVzKHggPSBwbGF6b19lbl9hbm9zLCB5ID0gdmFyaWFiLCBjb2xvciA9IGFzLmZhY3RvcihmZWNoYSkpKSArCiAgZ2VvbV9saW5lKCkgKwogIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXMgPSBnckRldmljZXM6OmNvbG9yUmFtcFBhbGV0dGUoUkNvbG9yQnJld2VyOjpicmV3ZXIucGFsKDgsICJEYXJrMiIpKSgyNTcpKSArCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiLAogICAgICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoaGp1c3QgPSAwLjUpKSArCiAgc2NhbGVfeF9jb250aW51b3VzKGJyZWFrcz1zZXEoMCwgMTAsIDEpKSsKICB5bGltKC0wLjAwMSwwLjAzKSsKICB5bGFiKCJWYXJpYWJpbGlkYWQiKSArCiAgeGxhYigiUGxhem8iKSArCiAgZ2d0aXRsZSgiVmFyaWFiaWxpZGFkIGN1cnZhcyBkZSB0YXNhcyBwb3Igc2VtYW5hIC0gQ29ydG8gUGxhem8iKSsKICBmYWNldF9ncmlkKH5hbm5vKQoKCgpkYXRvczIgJT4lCiAgZmlsdGVyKHBsYXpvPT0iTWVkaWFubyIpICU+JSAKICBnZ3Bsb3QoYWVzKHggPSBwbGF6b19lbl9hbm9zLCB5ID0gdmFyaWFiLCBjb2xvciA9IGFzLmZhY3RvcihmZWNoYSkpKSArCiAgZ2VvbV9saW5lKCkgKwogIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXMgPSBnckRldmljZXM6OmNvbG9yUmFtcFBhbGV0dGUoUkNvbG9yQnJld2VyOjpicmV3ZXIucGFsKDgsICJEYXJrMiIpKSgyNTcpKSArCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiLAogICAgICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoaGp1c3QgPSAwLjUpKSArCiAgc2NhbGVfeF9jb250aW51b3VzKGJyZWFrcz1zZXEoMCwgMTAsIDEpKSsKICB5bGltKC0wLjAwMSwwLjAzKSsKICB5bGFiKCJWYXJpYWJpbGlkYWQiKSArCiAgeGxhYigiUGxhem8iKSArCiAgZ2d0aXRsZSgiVmFyaWFiaWxpZGFkIGN1cnZhcyBkZSB0YXNhcyBwb3Igc2VtYW5hIC0gTWVkaWFubyBQbGF6byIpKwogIGZhY2V0X2dyaWQofmFubm8pCgoKCmRhdG9zMiAlPiUKICBmaWx0ZXIocGxhem89PSJMYXJnbyIpICU+JSAKICBnZ3Bsb3QoYWVzKHggPSBwbGF6b19lbl9hbm9zLCB5ID0gdmFyaWFiLCBjb2xvciA9IGFzLmZhY3RvcihmZWNoYSkpKSArCiAgZ2VvbV9saW5lKCkgKwogIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXMgPSBnckRldmljZXM6OmNvbG9yUmFtcFBhbGV0dGUoUkNvbG9yQnJld2VyOjpicmV3ZXIucGFsKDgsICJEYXJrMiIpKSgyNTcpKSArCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiLAogICAgICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoaGp1c3QgPSAwLjUpKSArCiAgc2NhbGVfeF9jb250aW51b3VzKGJyZWFrcz1zZXEoMCwgMTAsIDEpKSsKICB5bGltKC0wLjAwMSwwLjAzKSsKICB5bGFiKCJWYXJpYWJpbGlkYWQiKSArCiAgeGxhYigiUGxhem8iKSArCiAgZ2d0aXRsZSgiVmFyaWFiaWxpZGFkIGN1cnZhcyBkZSB0YXNhcyBwb3Igc2VtYW5hIC0gTGFyZ28gUGxhem8iKSsKICBmYWNldF9ncmlkKH5hbm5vKQoKCmBgYAoKKipWb2xhdGlsaWRhZCoqCgoKLSBQbGF6b3MgcG9yIGZlY2hhcwoKR2VuZXJhbAoKYGBge3J9CmRhdG9zMzwtZGF0b3MyICU+JSAKICBzZWxlY3Qoc2VtYW5hX3JhbmdvLGZlY2hhLHNlbWFuYSxtZXMsdHJpbWVzdHJlLGFubm8scGxhem8sdmFyaWFiKSAlPiUgCiAgZ3JvdXBfYnkoc2VtYW5hX3JhbmdvKSAlPiUgCiAgbXV0YXRlKG9icz1yb3dfbnVtYmVyKCkpCgojcGFyYSBhZ3J1cGFyIHkgY2FsY3VsYXIgbGEgZGVzdmlhY2lvbiBkZSBsYSB2YXJpYWJpbGlkYWQgY2FkYSAxMCBvYnNlcnZhY2lvbmVzCmRhdG9zMyRHUlA8LXJlcChjKDE6MzYwKSxlYWNoPTEwLDI1NikKCiN2b2xhdGlsaWRhZCBwb3Igc2VtYW5hCmRhdG9zNDwtZGF0b3MzICU+JSAKICBncm91cF9ieShzZW1hbmFfcmFuZ28sZmVjaGEsc2VtYW5hLG1lcyx0cmltZXN0cmUsYW5ubyxHUlApICU+JSAKICBzdW1tYXJpc2UoCiAgICBkZXN2PXNkKHZhcmlhYixuYS5ybSA9IFRSVUUpCiAgKQoKZGF0b3M0ICU+JQogIGdncGxvdChhZXMoeCA9IEdSUCwgeSA9IGRlc3YsIGNvbG9yID0gYXMuZmFjdG9yKGZlY2hhKSkpICsKICBnZW9tX2xpbmUoKSArCiAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcyA9IGdyRGV2aWNlczo6Y29sb3JSYW1wUGFsZXR0ZShSQ29sb3JCcmV3ZXI6OmJyZXdlci5wYWwoOCwgIkRhcmsyIikpKDI1NykpICsKICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIsCiAgICAgICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAuNSkpICsKICB5bGltKC0wLjAwMDAxLDAuMDEpKwogIHlsYWIoIlZvbGF0aWxpZGFkIikgKwogIHhsYWIoIiIpICsKICBnZ3RpdGxlKCJWb2xhdGlsaWRhZCBjdXJ2YXMgZGUgdGFzYXMgcG9yIHNlbWFuYSAtIFRvZG9zIGxvcyBwbGF6b3MiKQoKCmRhdG9zNCAlPiUKICBnZ3Bsb3QoYWVzKHggPSBHUlAsIHkgPSBkZXN2LCBjb2xvciA9IGFzLmZhY3RvcihmZWNoYSkpKSArCiAgZ2VvbV9saW5lKCkgKwogIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXMgPSBnckRldmljZXM6OmNvbG9yUmFtcFBhbGV0dGUoUkNvbG9yQnJld2VyOjpicmV3ZXIucGFsKDgsICJEYXJrMiIpKSgyNTcpKSArCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiLAogICAgICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoaGp1c3QgPSAwLjUpKSArCiAgeWxpbSgtMC4wMDAwMSwwLjAxKSsKICB5bGFiKCJWb2xhdGlsaWRhZCIpICsKICB4bGFiKCIiKSArCiAgZ2d0aXRsZSgiVm9sYXRpbGlkYWQgY3VydmFzIGRlIHRhc2FzIHBvciBzZW1hbmEgLSBUb2RvcyBsb3MgcGxhem9zIikrCiAgZmFjZXRfZ3JpZCh+YW5ubykKCmBgYAoKCgoKYGBge3J9CiNWb2xhdGlsaWRhZCBwb3IgcGxhem8KZGF0b3M1PC1kYXRvczMgJT4lIAogIGdyb3VwX2J5KHNlbWFuYV9yYW5nbyxmZWNoYSxzZW1hbmEsbWVzLHRyaW1lc3RyZSxhbm5vLHBsYXpvLEdSUCkgJT4lIAogIHN1bW1hcmlzZSgKICAgIGRlc3Y9c2QodmFyaWFiLG5hLnJtID0gVFJVRSkKICApCgoKZGF0b3M1ICU+JQogIGdncGxvdChhZXMoeCA9IEdSUCwgeSA9IGRlc3YsIGNvbG9yID0gYXMuZmFjdG9yKGZlY2hhKSkpICsKICBnZW9tX2xpbmUoKSArCiAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcyA9IGdyRGV2aWNlczo6Y29sb3JSYW1wUGFsZXR0ZShSQ29sb3JCcmV3ZXI6OmJyZXdlci5wYWwoOCwgIkRhcmsyIikpKDI1NykpICsKICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIsCiAgICAgICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAuNSkpICsKICB5bGltKC0wLjAwMDAxLDAuMDEpKwogIHlsYWIoIlZvbGF0aWxpZGFkIikgKwogIHhsYWIoIiIpICsKICBnZ3RpdGxlKCJWb2xhdGlsaWRhZCBjdXJ2YXMgZGUgdGFzYXMgcG9yIHNlbWFuYSB5IHBsYXpvcyIpKwogIGZhY2V0X2dyaWQofnBsYXpvKQoKCgpkYXRvczUgJT4lCiAgZmlsdGVyKHBsYXpvPT0iQ29ydG8iKSAlPiUgCiAgZ2dwbG90KGFlcyh4ID0gR1JQLCB5ID0gZGVzdiwgY29sb3IgPSBhcy5mYWN0b3IoZmVjaGEpKSkgKwogIGdlb21fbGluZSgpICsKICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzID0gZ3JEZXZpY2VzOjpjb2xvclJhbXBQYWxldHRlKFJDb2xvckJyZXdlcjo6YnJld2VyLnBhbCg4LCAiRGFyazIiKSkoMjU3KSkgKwogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIiwKICAgICAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMC41KSkgKwogIHlsaW0oLTAuMDAwMDEsMC4wMSkrCiAgeWxhYigiVm9sYXRpbGlkYWQiKSArCiAgeGxhYigiICIpICsKICBnZ3RpdGxlKCJWb2xhdGlsaWRhZCBjdXJ2YXMgZGUgdGFzYXMgcG9yIHNlbWFuYSAtIENvcnRvIFBsYXpvIikrCiAgZmFjZXRfZ3JpZCh+YW5ubykKCgoKZGF0b3M1ICU+JQogIGZpbHRlcihwbGF6bz09Ik1lZGlhbm8iKSAlPiUgCiAgZ2dwbG90KGFlcyh4ID0gR1JQLCB5ID0gZGVzdiwgY29sb3IgPSBhcy5mYWN0b3IoZmVjaGEpKSkgKwogIGdlb21fbGluZSgpICsKICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzID0gZ3JEZXZpY2VzOjpjb2xvclJhbXBQYWxldHRlKFJDb2xvckJyZXdlcjo6YnJld2VyLnBhbCg4LCAiRGFyazIiKSkoMjU3KSkgKwogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIiwKICAgICAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMC41KSkgKwogIHlsaW0oLTAuMDAwMDEsMC4wMSkrCiAgeWxhYigiVm9sYXRpbGlkYWQiKSArCiAgeGxhYigiICIpICsKICBnZ3RpdGxlKCJWb2xhdGlsaWRhZCBjdXJ2YXMgZGUgdGFzYXMgcG9yIHNlbWFuYSAtIE1lZGlhbm8gUGxhem8iKSsKICBmYWNldF9ncmlkKH5hbm5vKQoKCgpkYXRvczUgJT4lCiAgZmlsdGVyKHBsYXpvPT0iTGFyZ28iKSAlPiUgCiAgZ2dwbG90KGFlcyh4ID0gR1JQLCB5ID0gZGVzdiwgY29sb3IgPSBhcy5mYWN0b3IoZmVjaGEpKSkgKwogIGdlb21fbGluZSgpICsKICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzID0gZ3JEZXZpY2VzOjpjb2xvclJhbXBQYWxldHRlKFJDb2xvckJyZXdlcjo6YnJld2VyLnBhbCg4LCAiRGFyazIiKSkoMjU3KSkgKwogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIiwKICAgICAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMC41KSkgKwogIHlsaW0oLTAuMDAwMDEsMC4wMSkrCiAgeWxhYigiVm9sYXRpbGlkYWQiKSArCiAgeGxhYigiICIpICsKICBnZ3RpdGxlKCJWb2xhdGlsaWRhZCBjdXJ2YXMgZGUgdGFzYXMgcG9yIHNlbWFuYSAtIExhcmdvIFBsYXpvIikrCiAgZmFjZXRfZ3JpZCh+YW5ubykKCgoKYGBgCgoKCgoKCgoKCgoKCgoKCg==